home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Cream of the Crop 26
/
Cream of the Crop 26.iso
/
os2
/
pvm34b3.zip
/
pvm34b3
/
pvm3
/
examples
/
master1.f
< prev
next >
Wrap
Text File
|
1997-07-22
|
3KB
|
99 lines
c
c $Id: master1.f,v 1.2 1997/06/26 19:42:55 pvmsrc Exp $
c
program master1
include '../include/fpvm3.h'
c ---------------------------------------------------------
c Example fortran program illustrating the use of PVM 3
c ---------------------------------------------------------
integer i, info, nproc, nhost, msgtype
integer mytid, iptid, dtid, tids(0:32)
integer who, speed
double precision result(32), data(100)
character*18 nodename, host
character*8 arch
c ------------ Starting up all the tasks ---------------------------
c Enroll this program in PVM
call pvmfmytid( mytid )
c Set number of slaves to spawn.
c Note standard input cannot be read if spawned from console, so just
c derive nprocs from the VM config
call pvmfconfig( nhost, narch, dtid, host, arch, speed, info )
nproc = nhost * 3
if( nproc .gt. 32 ) nproc = 32
c
c Initiate nproc instances of slave1 program
c If arch is set to '*' then ANY configured machine is acceptable
write(6,6000) nproc
6000 format(' ','Spawning ', I4, ' tasks ...')
6001 format(' ',25X, 'SUCCESSFUL')
nodename = 'fslave1'
arch = '*'
call pvmfspawn( nodename, PVMDEFAULT, arch, nproc, tids, numt )
c Check for problems
100 continue
if( numt .lt. nproc ) then
print *, 'trouble spawning ',nodename
print *, ' Check tids for error code'
call shutdown( numt, tids )
endif
write(6,6001)
c ------- Begin user program --------
n = 100
c Initiate data array
do 20 i=1,n
data(i) = 1
20 continue
c broadcast data to all node programs
call pvmfinitsend( PVMDEFAULT, info )
call pvmfpack( INTEGER4, nproc, 1, 1, info )
call pvmfpack( INTEGER4, tids, nproc, 1, info )
call pvmfpack( INTEGER4, n, 1, 1, info )
call pvmfpack( REAL8, data, n, 1, info )
msgtype = 1
call pvmfmcast( nproc, tids, msgtype, info )
c wait for results from nodes
msgtype = 2
do 30 i=1,nproc
call pvmfrecv( -1, msgtype, info )
call pvmfunpack( INTEGER4, who, 1, 1, info )
call pvmfunpack( REAL8, result(who+1), 1, 1, info )
if (who .eq. 0) then
write(6,6002) result(who+1), who, (nproc - 1) * 100.0
else
write(6,6002) result(who+1), who, (2 * who - 1) * 100.0
endif
6002 format(' ', 'I got ', F15.7, ' from', I4,
+ ' (expected ',F15.7,' )')
30 continue
c --------- End user program --------
c program finished leave PVM before exiting
call pvmfexit(info)
stop
end
subroutine shutdown( nproc, tids )
integer nproc, tids(*)
c
c Kill all tasks I spawned and then myself
c
do 10 i=0, nproc
call pvmfkill( tids(i), info )
10 continue
call pvmfexit( info )
stop
return
end